package interfazGrafica.Grafo;

import java.awt.*;
import java.io.Serializable;
import java.util.ArrayList;

import javax.swing.JComponent;

import estructuraGrafo.Arco;
import estructuraGrafo.Grafo;

/**
 * Clase Linzo: Esta clase es la representacion grafica (2D) de la zona donde se puede dibujar el Grafo
 * 
 * @author  Grupo N11
 * @author  Prinsich Bernz, Emilio J. A.
 * @author 	Solia, Guillermo D.
 * @version  1.0
 */

public class Lienzo extends JComponent  implements Serializable{

	private static final long serialVersionUID = 1L;
	/**Lista de Puntos del grafico*/
	private ArrayList<Punto> puntos;
	/**Lista de Arista del grafico*/
	private ArrayList<Arista> aristas;
	/**Lista de Aristas auxiliares del grafico*/
	private ArrayList<Arista> neo;
	private Point a;
	private Point b;
	/**Estado del Grafo para con la consulta*/
	public boolean estado = false;
	public boolean punto = false;

	/**
	 * Constructor
	 */
	public Lienzo(){
		aristas = new ArrayList<Arista>();
		puntos = new ArrayList<Punto>();
		neo = new ArrayList<Arista>();
	}

	/**
	 * Pinta el grafico en el lienzo
	 */
	public void paintComponent(Graphics g){
		if (punto) {
			g.setColor(Color.BLUE);
			g.drawLine((int) a.getX() + 5, (int) a.getY() + 5, (int) b.getX() + 5, (int) b.getY() + 5);
		}
		for (int i = 0; i < aristas.size(); i++){
 			final Arista arista = (Arista) aristas.get(i);
			arista.pintarRecta(g);
		}
		if (estado)
			for (int i = 0; i < neo.size(); i++){
				final Arista arista = (Arista) neo.get(i);
				arista.setColor(Color.RED);
				arista.pintarRecta(g);
			}
		for (int i = 0; i < puntos.size(); i++){
			final Punto punto = (Punto) puntos.get(i);
			punto.pintarPunto(g);
		}
	}

	/**
	 * Cambia el grafo que esta en el linzo por el que se le pasa por parametro
	 * @param nuevo
	 */
	public void cambiarGrafo(Grafo nuevo){
		Arco aux;

		for (int i = 0; i < aristas.size(); i++){
			aux = aristas.get(i).getArista();

			if (nuevo.busarArista(aux) == true)
				neo.add(aristas.get(i));
		}

		for (int i = 0; i < aristas.size(); i++){
			final Arco n = aristas.get(i).getArista();
			nuevo.getAristas().add(n);
		}

		estado = true;

		repaint();
	}

	public ArrayList<Punto> getPuntos(){
		return puntos;
	}

	public void setPuntos(final ArrayList<Punto> puntos){
		this.puntos = puntos;
	}

	public ArrayList<Arista> getAristas(){
		return aristas;
	}

	public void setAristas(final ArrayList<Arista> aristas){
		this.aristas = aristas;
	}

	public ArrayList<Arista> getNeo(){
		return neo;
	}

	public void setNeo(final ArrayList<Arista> neo){
		this.neo = neo;
	}

	public void setA(Point a){
		this.a = a;
	}

	public void setB(Point b){
		this.b = b;
	}
	
	public Arista getAris(String str){
		Arista ar = null;
		for(Arista a : aristas){
			if(a.getNombre().equals(str))
				ar = a;
		}
		return ar;
	}
}